home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 25 / Cream of the Crop 25.iso / os2 / kzr0597.zip / N!.CMD < prev    next >
OS/2 REXX Batch file  |  1997-02-10  |  3KB  |  92 lines

  1. /* REXX-Funktion n!.CMD */
  2.    "@ echo off"
  3.  
  4.    Call RxFuncAdd 'SysLoadFuncs', RexxUtil, 'SysLoadFuncs'
  5.    Call SysLoadFuncs
  6.    signal on syntax name n!Msg
  7.  
  8. /* Diese Variablen müssen für jede Prozedur definiert werden, damit die  */
  9. /* Prozedur die Variable bufND kennt und die Variable ND übernehmen kann.*/
  10.    Pfd=SysSearchPath("PATH", "kzr.cmd")
  11.    lp=LastPos("\", Pfd)
  12.    Pfd=DelStr(Pfd, 1+lp)
  13.    bufND =Pfd||"NDZahl.DAT"
  14.    bufMsg=Pfd||"Meldung.DAT"
  15.    ND = LineIn(bufND, 1)
  16.  
  17.    parse arg n,y
  18.    p0p=n*n /* Diese Anweisung provoziert eine Syntax-Fehlermeldung */
  19.  
  20.    if length(y) > 0 then
  21.    do
  22.      ret=LineOut(bufMsg, "Im Argument von  n!(...)  ist mindestens  1  nicht zulässiges Komma !")
  23.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  24.   /*  damit in den diesbezüglichen temporären Dateien                      */
  25.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  26.      EXIT
  27.    end
  28.  
  29.    if n=0 then do u=1; Signal W; end
  30.  
  31.    if n < 0 then
  32.    do
  33.      ret=LineOut(bufMsg, "Das Argument der Funktion  n!(...)  muß größer als Null sein !")
  34.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  35.   /*  damit in den diesbezüglichen temporären Dateien                      */
  36.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  37.      EXIT
  38.    end
  39.  
  40.    if n > 6000 then
  41.    do
  42.      ret=LineOut(bufMsg, "Das Argument der Funktion  n!(...)  sollte 6000 nicht überschreiten,",
  43.                          "          ",
  44.                          "weil sonst die Rechenzeit zu groß werden würde.")
  45.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  46.   /*  damit in den diesbezüglichen temporären Dateien                      */
  47.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  48.      EXIT
  49.    end
  50.  
  51.    nn=n//1
  52.    if nn <> 0 then
  53.    do
  54.       ret=LineOut(bufMsg, "Das Argument der Funktion  n!(...)  muß eine ganze Zahl sein !")
  55.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  56.   /*  damit in den diesbezüglichen temporären Dateien                      */
  57.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  58.       EXIT
  59.     end
  60.  
  61.     Numeric Digits ND+10
  62.     u=1; i=1
  63.     do while (i<n+1)
  64.       u=u*i
  65.       i=i+1
  66.     end
  67.  
  68. W:
  69.    numeric digits ND
  70.    return(Format(u))
  71.  
  72. n!Msg:
  73.    sf=ErrorText(RC)
  74.    if  Pos("Arithmetic overflow", sf) > 0 | Pos("Invalid whole", sf) >0 then
  75.    do
  76.      ret=LineOut(bufMsg, "Es müssen zu große Zahlenwerte verarbeitet werden !")
  77.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  78.   /*  damit in den diesbezüglichen temporären Dateien                      */
  79.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  80.      EXIT
  81.    end
  82.  
  83.    if  Pos("Bad arithmetic conversion", sf) > 0 then
  84.    do
  85.      ret=LineOut(bufMsg, "Sie haben in  n!(...)  kein gültiges Argument eingegeben !")
  86.   /* "bufMsg" und  "bufND" werden immer beim Beenden von kzr.cmd gelöscht, */
  87.   /*  damit in den diesbezüglichen temporären Dateien                      */
  88.   /*  Meldungen und ND-Werte nicht aneinandergehängt werden.               */
  89.      EXIT
  90.    end
  91.  
  92.